/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.ucuenca.pagina_asos.uimanager;

import ec.edu.ucuenca.pagina_asos.controller.GenericController;
import ec.edu.ucuenca.pagina_asos.entity.Foro;
import ec.edu.ucuenca.pagina_asos.entity.Usuario;
import ec.edu.ucuenca.pagina_asos.uimanager.util.JsfUtil;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import org.apache.commons.lang3.RandomStringUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

/**
 *
 * @author Johnny
 */
@ManagedBean(name = "gestorEventos")
@ViewScoped
public class GestorEventos implements Serializable {

    /**
     * Creates a new instance of GestorEventos
     */
    private Foro foro;
    private String ext;
    private GenericController<Foro> controladorForo;
    InputStream archivo;
    private MapModel emptyModel;
    private ScheduleModel eventModel;
    private ScheduleEvent event = new DefaultScheduleEvent();
    private List<Foro> listaEventos;
    private boolean nuevo;
    private Usuario usuario;
    
    private GenericController<Foro> getControladorForo() {
        if (controladorForo == null) {
            controladorForo = new GenericController<Foro>();
        }
        return controladorForo;
    }
    
    public GestorEventos() {
        emptyModel = new DefaultMapModel();
    }
    
    public void nuevoEvento(SelectEvent selectEvent) {
        setForo(new Foro());
        foro.setFecha((Date) selectEvent.getObject());
        foro.setFechafin((Date) selectEvent.getObject());
        foro.setLatitud(-2.90176);
        foro.setLongitud(-79.01163);
        setNuevo(true);
        emptyModel = new DefaultMapModel();
        
    }
    
    public Foro getForo() {
        return foro;
    }
    
    public void setForo(Foro foro) {
        this.foro = foro;
    }
    
    public String getExt() {
        return ext;
    }
    
    public void setExt(String ext) {
        this.ext = ext;
    }
    
    public MapModel getEmptyModel() {
        return emptyModel;
    }
    
    public void setEmptyModel(MapModel emptyModel) {
        this.emptyModel = emptyModel;
    }
    
    public void upload(FileUploadEvent event) {
        JsfUtil.addSuccessMessage("subido");
        // Do what you want with the file        
        try {
            setArchivo(event.getFile().getInputstream());
            ext = event.getFile().getFileName().substring(event.getFile().getFileName().length() - 3);
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    public InputStream getArchivo() {
        return archivo;
    }
    
    public void setArchivo(InputStream archivo) {
        this.archivo = archivo;
    }
    
    public void guardarEvento() {
        foro.setEstado(0);
        foro.setTipo(2);
        if(archivo!=null)
        {
            Date d = new Date();
        String nombre = d.getYear() + "" + d.getMonth() + "" + d.getDay() + d.getHours() + d.getMinutes() + d.getTime();
        foro.setImagen(nombre + RandomStringUtils.randomAlphanumeric(10) + "." + ext);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ServletContext ss = (ServletContext) facesContext.getExternalContext().getContext();
        String p = ss.getRealPath("/resources/imagenesSubidas/noticias/");
        copyFile(p, foro.getImagen(), archivo);
        foro.setEscuela(getUsuario().getPersona().getEscuela());
        }
        if (eventModel == null) {
            eventModel = new DefaultScheduleModel();
        }
        JsfUtil.addSuccessMessage("Noticia Publicada correctamente");
        if(nuevo)
        {
        getControladorForo().create(foro);
        listaEventos.add(foro);
        eventModel.addEvent(new DefaultScheduleEvent(foro.getNombre(), foro.getFecha(), foro.getFechafin(),foro.getId()));       
        }
        
        else
        {
            try {
                getControladorForo().edit(foro);
                eventModel=null;
            } catch (Exception ex) {
                JsfUtil.addErrorMessage("Error al guardar el evento");
            }
            
        }
    }
    public void copyFile(String destination, String fileName, InputStream in) {
        try {
            // write the inputStream to a FileOutputStream
            destination = destination + "/";
            OutputStream out = new FileOutputStream(new File(destination + fileName));
            int read = 0;
            byte[] bytes = new byte[1024];
            
            ImageIO.write(resize(in), ext, new File(destination + fileName));
            
            
            System.out.println("New file created! " + destination + fileName);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
    public String getImagen()
    {
        
        if(foro==null||foro.getImagen().equals("")){
            return "/resources/images/no-image.png";
        }else{
            return "/resources/imagenesSubidas/noticias/"+foro.getImagen();
        }
    }
    private BufferedImage resize(InputStream in) throws IOException {
        BufferedImage originalImage = ImageIO.read(in);
        int h = originalImage.getHeight();
        int w = originalImage.getWidth();
        int nuevoAncho = (w * 600) / h;
        int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
        if (h > 600 || w > 800) {
            BufferedImage resizeImageJpg = resizeImage(originalImage, type, nuevoAncho);
            return resizeImageJpg;
        } else {
            return originalImage;
        }
    }
    
    private static BufferedImage resizeImage(BufferedImage originalImage, int type, int ancho) {
        BufferedImage resizedImage = new BufferedImage(ancho, 600, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, ancho, 600, null);
        g.dispose();
        
        return resizedImage;
    }
    
    public ScheduleModel getEventModel() {
        if (eventModel == null) {
            eventModel = new DefaultScheduleModel();
            listaEventos = getControladorForo().findWhere(new Foro(), "tipo=2 and estado=0 and idEscuela="+GestorPrincipal.getInstance().getEscuela().getId());
            for (int i = 0; listaEventos != null && i < listaEventos.size(); i++) {
                ScheduleEvent evento = new DefaultScheduleEvent(listaEventos.get(i).getNombre(), listaEventos.get(i).getFecha(), listaEventos.get(i).getFechafin(), listaEventos.get(i).getId());
                evento.setId(listaEventos.get(i).getId().toString());
                eventModel.addEvent(evento);
            }
            
        }
        return eventModel;
    }
    
    public void setEventModel(ScheduleModel eventModel) {
        this.eventModel = eventModel;
    }
    
    public void onEventSelect(SelectEvent selectEvent) {
        setNuevo(false);
        event = (ScheduleEvent) selectEvent.getObject();
        String id = event.getId();
        for (int i = 0; i < listaEventos.size(); i++) {
            if (listaEventos.get(i).getId() == (Long) event.getData()) {
                
                emptyModel = new DefaultMapModel();
                setForo(listaEventos.get(i));
                if (foro.getLatitud() != null && foro.getLatitud() != 0) {
                    emptyModel.addOverlay(new Marker(new LatLng(foro.getLatitud(), foro.getLongitud())));
                } else {
                    foro.setLatitud(-2.90176);
                    foro.setLongitud(-79.01163);
                }
                
            }
        }
    }
    public void cancelarEvento()
    {
        foro.setEstado(1);
        try {
            getControladorForo().edit(foro);
            eventModel.deleteEvent(event);
        } catch (Exception ex) {
            JsfUtil.addErrorMessage("Error al cancelar el evento");
        }
    }
    public boolean isNuevo() {
        return nuevo;
    }
    
    public void setNuevo(boolean nuevo) {
        this.nuevo = nuevo;
    }

    public Usuario getUsuario() {
        if(usuario==null)
        {
            usuario=GestorUsuario.getInstance().getUsuarioActual();
        }
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
        
    }
    
}
